package com.itdong.utils;

import com.itdong.domain.User;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /*初始化*/
    private static RedisUtils INSTANCE_OF_REDISUTILS = new RedisUtils();

    @PostConstruct //利用这个注解让这个类在被加载时就完成注入， 而不是等待到new实例时，这样才能在使用静态方法时就有redisTemplate对象。
    public void init(){
        INSTANCE_OF_REDISUTILS.redisTemplate = redisTemplate;
        INSTANCE_OF_REDISUTILS.stringRedisTemplate = stringRedisTemplate;
    }

    /*测试*/
    public static void test(){
        System.out.println(INSTANCE_OF_REDISUTILS.redisTemplate);
        System.out.println(INSTANCE_OF_REDISUTILS.stringRedisTemplate);
    }

    /*工具类方法*/

    /**
     * 指定缓存失效时间
     *
     * @param key  键
     * @param time 时间(秒)
     * @return
     */
    public static boolean expire(String key, long time) {
        try {
            if (time > 0) {
                INSTANCE_OF_REDISUTILS.redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据key 获取过期时间
     *
     * @param key 键 不能为null
     * @return 时间(秒) 返回0代表为永久有效
     */
    public static long getExpire(String key) {
        return INSTANCE_OF_REDISUTILS.redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }

    /**
     * 判断key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     */
    public static boolean hasKey(String key) {
        try {
            return INSTANCE_OF_REDISUTILS.redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     *
     * @param key 可以传一个值 或多个
     */
    @SuppressWarnings("unchecked") //告诉编译器忽略 unchecked 警告信息，如使用List，ArrayList等未进行参数化产生的警告信息
    public static void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                INSTANCE_OF_REDISUTILS.redisTemplate.delete(key[0]);
            } else {
                INSTANCE_OF_REDISUTILS.redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public static Object get(String key) {
        return key == null ? null : INSTANCE_OF_REDISUTILS.redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通缓存放入
     *
     * @param key   键
     * @param value 值
     * @return true成功 false失败
     */
    public static <T> boolean set(String key, T value) {
        try {
            INSTANCE_OF_REDISUTILS.redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }





}
